home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / FinderFlocks / Shell / DialogUtils.cp next >
Text File  |  1996-06-22  |  5KB  |  221 lines

  1. #include "DialogUtils.h"
  2.  
  3. /* Much of this code is from C.K. Haun's DialogBits snippet, but of course has
  4. been tweaked for my own purposes */
  5.  
  6.  
  7.  
  8. /* This filter proc only allows numeric input, and also does the standard key
  9. filtering */
  10. pascal Boolean NumFilter(DialogPtr dptr, EventRecord *event, short *item)
  11. {
  12.     char         theKey;
  13.     WindowPtr     temp;
  14.     Boolean        returnVal = false;
  15.     
  16.     GetPort(&temp);
  17.     SetPort(dptr);
  18.     
  19.     /* Change the cursor to an I Beam if it's over the active editText item */
  20.     IBeamIt(dptr);
  21.     
  22.     /* Standard key filtering */
  23.     returnVal = StdKeyFilter(dptr, event, item);
  24.     
  25.     /* if that didn't handle it... */
  26.     if(returnVal == false)
  27.     {
  28.         /* We're only allowing numeric characters */
  29.         if ((event->what == keyDown) || (event->what == autoKey))
  30.         {
  31.             theKey = event->message & charCodeMask;
  32.             if(theKey > kLastCntrlKey && theKey < kDeleteKey)         /* Printable Ascii? */
  33.             {
  34.                 if (theKey < '0' || theKey > '9') /* not a number? */
  35.                 {
  36.                     SysBeep(1);            /* complain a little */
  37.                     returnVal = true;
  38.                 }
  39.             }
  40.             else 
  41.                 returnVal = false;
  42.         }
  43.     }
  44.     SetPort(temp);
  45.     return(returnVal);
  46. }
  47.  
  48. /* Standard key filtering: return or enter hit the OK button, escape hits cancel.
  49.     Also Hilite the button for visual feedback. */
  50. pascal Boolean StdKeyFilter(DialogPtr dptr, EventRecord *event, short *item)
  51. {
  52.     long         tilticks;
  53.     char         theKey;
  54.     Boolean        returnVal = false;
  55.  
  56.     if ((event->what == keyDown) || (event->what == autoKey))
  57.     {
  58.         theKey = event->message & charCodeMask;
  59.         switch (theKey)
  60.         {
  61.             /* return or enter hits the OK button */
  62.             case kReturnKey:
  63.             case kEnterKey:
  64.                 *item = kOKButton;
  65.                 /* now we need to invert the button */
  66.                 HiliteControl(SnatchHandle(dptr, kOKButton), inButton);
  67.                 Delay(8, &tilticks);        /* wait about 8 ticks so they can see it */
  68.                 HiliteControl(SnatchHandle(dptr, kOKButton), 0);
  69.                 returnVal = true;
  70.                 break;
  71.     
  72.             /* Escape hits the cancel button */
  73.             case kEscKey:
  74.                 *item = kCancelButton;
  75.                 HiliteControl(SnatchHandle(dptr, kCancelButton), inButton);
  76.                 Delay(8, &tilticks);        /* wait about 8 ticks so they can see it */
  77.                 HiliteControl(SnatchHandle(dptr, kCancelButton), 0);
  78.                 returnVal = true;
  79.                 break;
  80.             
  81.             default:
  82.                 break;
  83.         }
  84.     }
  85.     return returnVal;
  86. }       
  87.  
  88. void IBeamIt(WindowPtr dwind)
  89. {
  90.     Point     thePt;
  91.     short     kind;
  92.     Handle     itmhndl;
  93.     Rect     rect;
  94.     short     itemNum;
  95.     
  96.     /* first get the current edit line out of the dialog record */
  97.     itemNum = ((DialogPeek)dwind)->editField + 1;           /* always stored 1 less */
  98.     GetDItem(dwind, itemNum, &kind, &itmhndl, &rect);
  99.     GetMouse(&thePt);
  100.     if (PtInRect(thePt, &rect))
  101.     {
  102.         SetCursor(*(GetCursor(iBeamCursor)));
  103.     }
  104.     else
  105.     {
  106.         InitCursor();
  107.     }
  108. }
  109.  
  110. void ShortToDlog(short val, DialogPtr dptr, short item)
  111. {
  112.     short                kind;
  113.     Handle                itmhndl;
  114.     Rect                rect;
  115.     Str255                tempstr;
  116.     
  117.     NumToString((long)val, tempstr);
  118.     GetDItem(dptr, item, &kind, &itmhndl, &rect);
  119.     SetIText(itmhndl, tempstr);
  120. }
  121.  
  122. short DlogToShort(DialogPtr dptr, short itmnum)
  123. {
  124.     Handle            itmhndl;
  125.     Rect            rect;
  126.     Str255            tempstr;
  127.     short            kind;
  128.     long            temp;
  129.  
  130.     GetDItem(dptr, itmnum, &kind, &itmhndl, &rect);
  131.     GetIText(itmhndl, tempstr);
  132.     StringToNum(tempstr, &temp);
  133.     return (short)temp;
  134. }
  135.  
  136. short FutureNumber(DialogPtr dptr, short itmnum, char nextNum)
  137. {
  138.     Handle            itmhndl;
  139.     Rect            rect;
  140.     Str255            tempstr, numNow;
  141.     short            kind;
  142.     short            srcCnt, dstCnt, charCnt, selStart, selEnd;
  143.     long            num;
  144.     
  145.     /* Get the text we have so far */
  146.     GetDItem(dptr, itmnum, &kind, &itmhndl, &rect);
  147.     GetIText(itmhndl, numNow);
  148.     
  149.     /* Get the selection range */
  150.     selStart = (**(((DialogPeek)dptr)->textH)).selStart;
  151.     selEnd = (**(((DialogPeek)dptr)->textH)).selEnd;
  152.  
  153.     /* First copy the string before the selection starts */
  154.     charCnt = 0;
  155.     for(srcCnt = 1; srcCnt <= selStart; srcCnt++)
  156.     {
  157.         tempstr[srcCnt] = numNow[srcCnt];
  158.         charCnt++;
  159.     }
  160.     /* Then add the key char */    
  161.     tempstr[srcCnt++] = nextNum;
  162.     charCnt++;
  163.     
  164.     dstCnt = srcCnt;
  165.     
  166.     /* Finally the rest of the string, after the selection */
  167.     for(srcCnt = selEnd + 1; srcCnt <= numNow[0]; srcCnt++)
  168.     {
  169.         tempstr[dstCnt++] = numNow[srcCnt];
  170.         charCnt++;
  171.     }
  172.     tempstr[0] = charCnt;
  173.     StringToNum(tempstr, &num);
  174.     return (short)num;
  175. }
  176.  
  177. pascal void BtnItem(DialogPtr dptr, short item)
  178. {
  179.     short            type;
  180.     Rect            rect;
  181.     Handle            hndl;
  182.     PenState        old;
  183.     
  184.     GetPenState(&old);
  185.     PenSize(3, 3);
  186.     GetDItem(dptr, item, &type, &hndl, &rect);
  187.     InsetRect(&rect, -4, -4);
  188.     FrameRoundRect(&rect, 16, 16);
  189.     SetPenState(&old);
  190. }    
  191.  
  192. /* Gets the ControlHandle for the item you want in the dialog box thebox.
  193.     Handy for setting checkboxes and radio buttons */
  194. ControlHandle SnatchHandle(DialogPtr thebox, short theGetItem)
  195. {
  196.     short itemtype;
  197.     Rect itemrect;
  198.     Handle thandle;
  199.     
  200.     GetDItem(thebox, theGetItem, &itemtype, &thandle, &itemrect);
  201.     return((ControlHandle)thandle);
  202. }
  203.  
  204. void EnableControl(DialogPtr dptr, short itemNum)
  205. {
  206.     ControlHandle itemHandle;
  207.     
  208.     itemHandle = SnatchHandle(dptr, itemNum);
  209.     if(itemHandle != nil)
  210.         HiliteControl(itemHandle, 0);
  211. }
  212.  
  213. void DisableControl(DialogPtr dptr, short itemNum)
  214. {
  215.     ControlHandle itemHandle;
  216.     
  217.     itemHandle = SnatchHandle(dptr, itemNum);
  218.     if(itemHandle != nil)
  219.         HiliteControl(itemHandle, 255);
  220. }
  221.